package com.study.cglib_proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibInterceptor implements MethodInterceptor {

    //目标对象
    private Object target;

    public CglibInterceptor(Object target) {
        this.target = target;
    }

    /**
     * 用来获取代理对象
     * @return
     */
    public Object getProxy(){
        //通过Enhancer对象重的create()方法生成一个类，用于生成代理对象
        Enhancer enhancer = new Enhancer();
        //设置父类(将目标类作为代理类的父类)
        enhancer.setSuperclass(target.getClass());
        //设置规则  CglibInterceptor implements  MethodInterceptor extends Callback
        enhancer.setCallback(this);
        //生成代理对象
        Object proxy = enhancer.create();
        return proxy;
    }

    /**
     * 拦截器
     *  1.目标对象的方法调用
     *  2.行为的增强
     * @param o 代理对象示例
     * @param method 实体类锁调用的被代理的方法的引用
     * @param objects  参数列表
     * @param methodProxy 生成的代理类对方法的代理引用
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o,
                            Method method,
                            Object[] objects,
                            MethodProxy methodProxy) throws Throwable {
        //增强行为

        //目标方法调用
        Object invoke = method.invoke(target, objects);

        //增强行为

        return invoke;
    }
}
